from datetime import timedelta
from sqlalchemy.engine.url import URL


class BaseConfig(object):
    DEBUG = False                                                   # 调试模式
    TESTING = False                                                 # 测试模式
    PROPAGATE_EXCEPTIONS = None                                     # 异常会重新引发而不是被应用的错误处理器处理
    PRESERVE_CONTEXT_ON_EXCEPTION = None                            # 当异常发生时，不要弹出请求情境
    TRAP_HTTP_EXCEPTIONS = False                                    # 如果没有处理 HTTPException 类型异常的处理器，重新引发该异常用于被交互调试器处理
    TRAP_BAD_REQUEST_ERRORS = None                                  #
    SECRET_KEY = None                                               # 密钥用于会话 cookie 的安全签名
    SESSION_COOKIE_NAME = 'session'                                 # 会话 cookie 的名称
    SESSION_COOKIE_DOMAIN = None                                    # 认可会话 cookie 的域的匹配规则
    SESSION_COOKIE_PATH = None                                      # 会话 cookie 的路径
    SESSION_COOKIE_HTTPONLY = True                                  # 为了安全，浏览器不会允许 JavaScript 操作标记为“HTTP only ”的 cookie
    SESSION_COOKIE_SECURE = False                                   # 如果 cookie 标记为“secure ”，那么浏览器只会使用基于 HTTPS 的请求发送 cookie 。应用必须使用HTTPS 服务来启用本变量
    SESSION_COOKIE_SAMESITE = None                                  # 限制来自外部站点的请求如何发送 cookie 。可以被设置为 'Lax' （推荐）或者 'Strict' 。参见Set_Cookie 选项.
    PERMANENT_SESSION_LIFETIME = timedelta(days=31)                 # 如果 session.permanent 为真，cookie 的有效期为本变量设置的数字，单位为秒。本变量可能是一个 datetime.timedelta 或者一个 int
    SESSION_REFRESH_EACH_REQUEST = True                             # 当 session.permanent 为真时，控制是否每个响应都发送 cookie
    USE_X_SENDFILE = False                                          # 当使用 Flask 提供文件服务时，设置 X-Sendfile 头部
    SEND_FILE_MAX_AGE_DEFAULT = timedelta(hours=12)                 # 当提供文件服务时，设置缓存，控制最长存活期，以秒为单位
    SERVER_NAME = None                                              # 通知应用其所绑定的主机和端口。子域路由匹配需要本变量
    APPLICATION_ROOT = '/'                                          # 应用的根路径,如果 SESSION_COOKIE_PATH 没有配置，那么本变量会用于会话 cookie 路径
    PREFERRED_URL_SCHEME = 'http'                                   # 当不在请求情境内时使用些预案生成外部 URL
    MAX_CONTENT_LENGTH = None                                       # 请求数据中读取的最大字节数
    JSON_AS_ASCII = True                                            # 把对象序列化为 ASCII-encoded JSON
    JSON_SORT_KEYS = True                                           # 按字母排序 JSON 对象的键
    JSONIFY_PRETTYPRINT_REGULAR = False                             # jsonify 响应会输出新行、空格和缩进以便于阅读。在调试模式下总是启用的。
    JSONIFY_MIMETYPE = 'application/json'                           # jsonify 响应的媒体类型
    TEMPLATES_AUTO_RELOAD = None                                    # 当模板改变时重载它们。如果没有配置，在调试模式下会启用
    EXPLAIN_TEMPLATE_LOADING = False                                # 记录模板文件如何载入的调试信息。使用本变量有助于查找为什么模板没有载入或者载入了错误的模板的原因。
    MAX_COOKIE_SIZE = 4093                                          # 当 cookie 头部大于本变量配置的字节数时发出警告。缺省值为 4093 。更大的 cookie 会被浏览器悄悄地忽略。本变量设置为 0 时关闭警告

    DB_HOST = '127.0.0.1'
    DB_PORT = '3306'
    DB_USER = 'root'
    DB_PASS = 'haixing'
    DB_DATA = 'haixing_corp'
    @property
    def DATABASE_URI(self):
        return URL('mysql',username=self.DB_USER,password=self.DB_PASS,host=self.DB_HOST,port=self.DB_PORT,database=self.DB_DATA)

    # Flask-SQLAlchemy
    SQLALCHEMY_DATABASE_URI = f'mysql+mysqldb://{DB_USER}:{DB_PASS}@{DB_HOST}/{DB_DATA}'
    # SQLALCHEMY_BINDS                                                # 一个映射绑定 (bind) 键到 SQLAlchemy 连接 URIs 的字典。 更多的信息请参阅 绑定多个数据库。
    # SQLALCHEMY_ECHO = False                                         # 如果设置成 True，SQLAlchemy 将会记录所有 发到标准输出(stderr)的语句，这对调试很有帮助。
    # SQLALCHEMY_RECORD_QUERIES = None                                # 可以用于显式地禁用或者启用查询记录。查询记录 在调试或者测试模式下自动启用。更多信息请参阅 get_debug_queries()。
    # SQLALCHEMY_NATIVE_UNICODE = None                                # 可以用于显式地禁用支持原生的 unicode。这是 某些数据库适配器必须的（像在 Ubuntu 某些版本上的 PostgreSQL），当使用不合适的指定无编码的数据库 默认值时
    # SQLALCHEMY_POOL_SIZE = 5                                        # 数据库连接池的大小。默认是数据库引擎的默认值 （通常是 5）
    # SQLALCHEMY_POOL_TIMEOUT = 10                                    # 指定数据库连接池的超时时间。默认是 10。
    # SQLALCHEMY_POOL_RECYCLE = ''                                    # 自动回收连接的秒数。这对 MySQL 是必须的，默认 情况下 MySQL 会自动移除闲置 8 小时或者以上的连接。 需要注意地是如果使用 MySQL 的话， Flask-SQLAlchemy 会自动地设置这个值为 2 小时。
    # SQLALCHEMY_MAX_OVERFLOW = ''                                    # 控制在连接池达到最大值后可以创建的连接数。当这些额外的 连接回收到连接池后将会被断开和抛弃。
    SQLALCHEMY_TRACK_MODIFICATIONS = True                             # 如果设置成 True (默认情况)，Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存， 如果不必要的可以禁用它。

    # WTF
    WTF_CSRF_ENABLED = True
    WTF_CSRF_CHECK_DEFAULT = True
    # WTF_CSRF_SECRET_KEY
    WTF_CSRF_METHODS = {'POST', 'PUT', 'PATCH', 'DELETE'}
    # WTF_CSRF_FIELD_NAME
    # WTF_CSRF_HEADERS ['X-CSRFToken', 'X-CSRF-Token']
    WTF_CSRF_TIME_LIMIT = 3600
    # WTF_CSRF_SSL_STRICT = True
    # WTF_I18N_ENABLED
    # RECAPTCHA_USE_SSL = False
    # RECAPTCHA_PUBLIC_KEY
    # RECAPTCHA_PRIVATE_KEY
    # RECAPTCHA_OPTIONS


class DevConfig(BaseConfig):
    SECRET_KEY = 'abc123'
    DEBUG = True


class ProdConfig(BaseConfig):
    SECRET_KEY = 'gQu8w*b+]tm&WOhi'


class TestConfig(BaseConfig):
    TESTING = True
